package com.ruoyi.system.service.impl;

import java.util.ArrayList;
import java.util.List;
import cn.hutool.core.collection.CollectionUtil;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.PageField;
import com.ruoyi.system.mapper.PageFieldMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.PageFieldUserMapper;
import com.ruoyi.system.domain.PageFieldUser;
import com.ruoyi.system.service.IPageFieldUserService;

/**
 * 用户修改页面与字段关系Service业务层处理
 *
 * @author ruoyi
 * @date 2023-08-01
 */
@Service
public class PageFieldUserServiceImpl implements IPageFieldUserService
{

    private static final Logger log = LoggerFactory.getLogger(PageFieldUserServiceImpl.class);

    @Autowired
    private PageFieldUserMapper pageFieldUserMapper;

    @Autowired
    private PageFieldMapper pageFieldMapper;


    /**
     * 查询用户修改页面与字段关系
     *
     * @param id 用户修改页面与字段关系主键
     * @return 用户修改页面与字段关系
     */
    @Override
    public PageFieldUser selectPageFieldUserById(Long id)
    {
        return pageFieldUserMapper.selectPageFieldUserById(id);
    }

    /**
     * 查询用户修改页面与字段关系列表
     *
     * @param pageFieldUser 用户修改页面与字段关系
     * @return 用户修改页面与字段关系
     */
    @Override
    public List<PageFieldUser> selectPageFieldUserList(PageFieldUser pageFieldUser)
    {
        return pageFieldUserMapper.selectPageFieldUserList(pageFieldUser);
    }

    /**
     * 新增用户修改页面与字段关系
     *
     * @param pageFieldUser 用户修改页面与字段关系
     * @return 结果
     */
    @Override
    public int insertPageFieldUser(PageFieldUser pageFieldUser)
    {
        //
        pageFieldUser.setCreateTime(DateUtils.getNowDate());
        return pageFieldUserMapper.insertPageFieldUser(pageFieldUser);
    }

    /**
     * 修改用户修改页面与字段关系
     *
     * @param pageFieldUser 用户修改页面与字段关系
     * @return 结果
     */
    @Override
    public int updatePageFieldUser(PageFieldUser pageFieldUser)
    {
        pageFieldUser.setUpdateTime(DateUtils.getNowDate());
        return pageFieldUserMapper.updatePageFieldUser(pageFieldUser);
    }

    /**
     * 批量删除用户修改页面与字段关系
     *
     * @param ids 需要删除的用户修改页面与字段关系主键
     * @return 结果
     */
    @Override
    public int deletePageFieldUserByIds(Long[] ids)
    {
        return pageFieldUserMapper.deletePageFieldUserByIds(ids);
    }

    /**
     * 删除用户修改页面与字段关系信息
     *
     * @param id 用户修改页面与字段关系主键
     * @return 结果
     */
    @Override
    public int deletePageFieldUserById(Long id)
    {
        return pageFieldUserMapper.deletePageFieldUserById(id);
    }

    @Override
    public AjaxResult savePageFieldUser(List<PageFieldUser> pageFieldUserList) {
        //遍历
        try {
            if(CollectionUtil.isNotEmpty(pageFieldUserList)){
                for(int i = 0 ;i < pageFieldUserList.size();i ++){
                    PageFieldUser pageFieldUser = pageFieldUserList.get(i);
                    Long id = pageFieldUser.getId();
                    int sort = i+1;
                    pageFieldUser.setSort(Long.valueOf(sort));
                    if(id != null){ //id不为空，则更新，为空则，新增
                        /*
                            根据id 如果存在，则修改sort，isShow和updateTime；
                            如果不存在，则新增数据
                         */
                        pageFieldUserMapper.updatePageFieldUser(pageFieldUser);
                    }else{
                        pageFieldUser.setIsShow(pageFieldUser.getIsShow());
                        LoginUser loginUser = SecurityUtils.getLoginUser();//获取当前登录信息
                        SysUser sysUser = loginUser.getUser();
                        Long userId = sysUser.getUserId();
                        pageFieldUser.setUserId(userId);
                        pageFieldUserMapper.insertPageFieldUser(pageFieldUser);
                    }
                }
                return AjaxResult.success();
            }
        }catch (Exception e){
            log.error(e.getMessage());
            return AjaxResult.error();
        }
        return AjaxResult.success();
    }

    @Override
    public List<PageFieldUser> getAllList(PageFieldUser pageFieldUser) {
        //获取当前用户的信息
        List<PageFieldUser> pageFieldUserList = new ArrayList();
        try {
            LoginUser loginUser = SecurityUtils.getLoginUser();//获取当前登录信息
            SysUser sysUser = loginUser.getUser();
            if(sysUser != null){
                boolean isAdmin = false;
                List<PageField> pageFieldList = new ArrayList<>();
                //先获取 pagefielduser 中的数据
                PageFieldUser pageFieldUserQuery = new PageFieldUser();
                Long userId = sysUser.getUserId();
                pageFieldUserQuery.setUserId(userId);
                String type = pageFieldUser.getType();
                pageFieldUserQuery.setType(type);
                String page = pageFieldUser.getPage();
                pageFieldUserQuery.setPage(page);
                pageFieldUserList = pageFieldUserMapper.selectPageFieldUserList(pageFieldUserQuery);
                if(CollectionUtil.isEmpty(pageFieldUserList)){ //如果为空，取pagefield中的数据放入pagefielduser中
                    PageField query = new PageField();
                    query.setType(type);
                    query.setPage(page);
                    //判断当前账号是否为内部员工
                    String isRegister = sysUser.getIsRegister();
                    if(StringUtils.isNotEmpty(isRegister) && isRegister.equals("1")){ //注册账户，不是内部员工
                        query.setIsStaff("0");
                    }else { //内部员工
                        List<SysRole> roleList = sysUser.getRoles();
                        if(CollectionUtil.isNotEmpty(roleList)){ //不为空且角色包含数据管理员和超级管理员
                            for(SysRole sysRole : roleList){
                                if(StringUtils.isNotEmpty(sysRole.getRoleName()) && (sysRole.getRoleName().equals("超级管理员") || sysRole.getRoleName().equals("数据管理员"))){
                                    isAdmin = true;
                                    break;
                                }
                            }
                        }
                        if(!isAdmin){
                            query.setIsStaff("1");
                        }
                    }
                    pageFieldList = pageFieldMapper.selectPageFieldList(query);
                    if(CollectionUtil.isNotEmpty(pageFieldList)){
                        List<PageFieldUser> tempPageFieldUserList = new ArrayList<>();
                        pageFieldList.stream().forEach(pageField -> {
                            PageFieldUser pageFieldUser1 = new PageFieldUser();
                            pageFieldUser1.setPage(pageField.getPage());
                            pageFieldUser1.setType(pageField.getType());
                            pageFieldUser1.setFieldId(pageField.getId());
                            pageFieldUser1.setSort(pageField.getSort());
                            pageFieldUser1.setFieldNameCn(pageField.getFieldNameCn());
                            pageFieldUser1.setFieldName(pageField.getFieldName());
                            pageFieldUser1.setIsShow("1");
                            tempPageFieldUserList.add(pageFieldUser1);
                        });
                        pageFieldUserList.addAll(tempPageFieldUserList);
                    }
                }else { //如果不为空，拼接
                    pageFieldUserList.stream().forEach(pageFieldUser1 -> {
                        Long id = pageFieldUser1.getFieldId();
                        PageField pageField = pageFieldMapper.selectPageFieldById(id);
                        if(pageField != null){
                            pageFieldUser1.setFieldNameCn(pageField.getFieldNameCn());
                            pageFieldUser1.setFieldName(pageField.getFieldName());
                        }

                    });
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return pageFieldUserList;
    }

    @Override
    public List<PageFieldUser> exportFieldList(PageFieldUser pageFieldUser) {
        //获取当前用户的信息
        List<PageFieldUser> pageFieldUserList = new ArrayList();
        try {
            LoginUser loginUser = SecurityUtils.getLoginUser();//获取当前登录信息
            SysUser sysUser = loginUser.getUser();
            if(sysUser != null){
                List<PageField> pageFieldList = new ArrayList<>();
                pageFieldUserList = pageFieldUserMapper.selectPageFieldUserList(pageFieldUser);
                if(CollectionUtil.isEmpty(pageFieldUserList)){ //如果为空，取pagefield中的数据放入pagefielduser中
                    PageField query = new PageField();
                    query.setType(pageFieldUser.getType());
                    query.setPage(pageFieldUser.getPage());
                    //判断当前账号是否为内部员工
                    String isRegister = sysUser.getIsRegister();
                    if(StringUtils.isNotEmpty(isRegister) && isRegister.equals("1")){ //注册账户，不是内部员工
                        query.setIsStaff("0");
                    }
                    pageFieldList = pageFieldMapper.selectPageFieldList(query);
                    if(CollectionUtil.isNotEmpty(pageFieldList)){
                        List<PageFieldUser> tempPageFieldUserList = new ArrayList<>();
                        pageFieldList.stream().forEach(pageField -> {
                            PageFieldUser pageFieldUser1 = new PageFieldUser();
                            pageFieldUser1.setPage(pageField.getPage());
                            pageFieldUser1.setType(pageField.getType());
                            pageFieldUser1.setFieldId(pageField.getId());
                            pageFieldUser1.setSort(pageField.getSort());
                            pageFieldUser1.setFieldNameCn(pageField.getFieldNameCn());
                            pageFieldUser1.setFieldName(pageField.getFieldName());
                            pageFieldUser1.setIsShow("1");
                            tempPageFieldUserList.add(pageFieldUser1);
                        });
                        pageFieldUserList.addAll(tempPageFieldUserList);
                    }
                }else { //如果不为空，拼接
                    pageFieldUserList.stream().forEach(pageFieldUser1 -> {
                        Long id = pageFieldUser1.getFieldId();
                        PageField pageField = pageFieldMapper.selectPageFieldById(id);
                        if(pageField != null){
                            pageFieldUser1.setFieldNameCn(pageField.getFieldNameCn());
                            pageFieldUser1.setFieldName(pageField.getFieldName());
                        }

                    });
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return pageFieldUserList;
    }
}
